package com.wang.tool.monitor.weaver;

import com.wang.tool.monitor.core.MonitorInfo;
import com.wang.tool.monitor.core.LinkInfo;

/**
 * 监控编织器
 * 为了解决不同层的函数出入参模型不一致及想要记录的核心参数不一致而设计的扩展点
 * 不同函数可以自定义织入器织入自己关注的属性,由MonitorWriter统一输出
 *
 * @Description
 * @Author shaopeng
 * @Date 2022/6/27
 * @Version 1.0
 */
public interface MonitorWeaver<R> {

    /**
     * 前置织入
     * 1.在并行场景下父节点返回时子节点还未执行完毕
     * 这时该链路上不会进行相关属性织入(正常的摘要信息不会丢失)
     * 有时核心属性在链路侦测需要记录,这里留一个口子
     * 此时没有耗时/结果相关数据,仅有入参之类
     * 2.debug设置,根据参数判断是否需要debug
     * 3.slowTime设置,设置慢调用阈值
     * 4.outTime设置,设置超时阈值
     * 注意性能
     * @param monitorInfo 非空
     * @throws Throwable 异常会被吞掉
     * @see MonitorInfo#markDebug
     * @see MonitorInfo#setSlowTime
     * @see MonitorInfo#setOutTime
     */
    void weaveOnBefore(MonitorInfo<R> monitorInfo) throws Throwable;

    /**
     * 后置织入
     * 有时出现异常我们想记录异常类型
     * 或者结果是Result包住的
     * 我们想记录Result里的success等
     * 这个扩展提供每个函数不一样的记录
     * 可根据当前状态进行特殊处理
     * 例如,有异常记录异常描述信息
     * 注意性能
     * @param monitorInfo 非空
     * @throws Throwable 异常会被吞掉
     * @see LinkInfo#status
     * @see LinkInfo#digests
     * @see LinkInfo#tags
     * @see MonitorInfo#details
     * @see MonitorInfo#isFailOut
     * @see MonitorInfo#isDebug
     * @see MonitorInfo#isRoot
     * @see MonitorInfo#hasSegments
     * @see MonitorInfo#addDigest
     * @see MonitorInfo#addTag
     * @see MonitorInfo#addDetail
     * @see MonitorInfo#buildTipsMap
     */
    void weaveOnAfter(MonitorInfo<R> monitorInfo) throws Throwable;

}
